<!doctype html>
<html lang="en">

<head>
  <!-- Required meta tags -->
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

  <link rel="shortcut icon" href="favicon.ico" type="image/x-icon">

  <!-- Bootstrap CSS -->

  <link rel="stylesheet" type="text/css" href="bootstrap/css/bootstrap.min.css" />
  <link rel="stylesheet" type="text/css" href="DataTables/datatables.min.css" />

  <title>LSSY量化交易服务平台</title>
</head>

<body>
  <div class="pos-f-t">
    <div class="navbar-expand-lg" id="navbarToggleExternalContent">
      <div class="bg-dark p-4">
        <h5 class="text-white h4">LSSY量化交易服务平台</h5>
      </div>
    </div>
    <nav class="navbar navbar-expand-lg navbar-dark bg-dark">
      <div class="navbar-nav">
        <a class="nav-item nav-link" href="/index.html">行情</a>
        <a class="nav-item nav-link" href="#" id="fupan">今日复盘</a>
        <a class="nav-item nav-link active" href="/cl.html">策略</a>
        <a class="nav-item nav-link" href="/backtest.html">回测</a>
      </div>
    </nav>
  </div>
  <!-- 提示 -->
  <div aria-live="polite" aria-atomic="true"
    class="container-fluid h-100 d-flex justify-content-center align-items-center" style="display: none !important;">
    <div id="info_toast" class="toast w-50 border" role="alert" aria-live="assertive" aria-atomic="true"
      data-delay="3000">
      <div class="toast-header text-white bg-dark">
        <strong class="mr-auto">标题</strong>
        <button type="button" class="ml-2 mb-1 close" data-dismiss="toast" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <div class="toast-body bg-dark">
        <img src="#" class="rounded mr-2" alt="...">
        <span></span>
      </div>
    </div>
  </div>
  <!-- 状态提示 -->
  <div id="zs" class="container-fluid clearfix"></div>
  <div class="container text-white bg-dark">
    <div class="row">
      <div class="col-md-auto">更新时间：</div>
      <div id="last_time" class="col-md-auto"></div>
      <div class="col-md-auto">延时：</div>
      <div id="info_y" class="col-md-auto"></div>
      <div class="col-md-auto">市场情绪：</div>
      <div id="info_schyd" class="col-md-auto"></div>
    </div>
  </div>
  <!-- 主界面 -->
  <div class="container-fluid text-white bg-dark my-3">
    <br>说明
    <div>1.本系统是面向需要建立自己独立的量化交易系统的量投研究者、已有交易策略需要实现计算机自动交易的交易员。
      <br>2.本系统是纯本地化的量化交易系统，您可以部署在自己使用的计算机上，通过本地地址127.0.0.1访问即可呈现您现在看到的页面，也可以像该演示系统部署在云服务器。
      <br>3.采用B/S结构，客户端只需要通过浏览器即可直接访问。
      <br>4.系统采用python和js开发，只依赖redis数据库，无需任何配置，运行 runWork.py 即可启动整个系统。系统会定时更新历史数据。作为量化投资者，你只需要研究自己的策略即可，即下面的红色交易逻辑代码，其他代码基本是固定的。
      <br>5.要求计算机有5GB以上可用磁盘空间、2GB以上可用内存。
      <br>6.需要量化投资者了解python语言基础，能看懂下面的策略代码即可，python非常简单，如果完全看不懂python代码，建议学习一下python基础！
      <br>7.本系统是我们陆陆续续修修改改历经3个年头完成的一整套交易系统，我们也跑过实盘，现在需要一笔启动资金，提供给有需要的人，感谢支持。
      <br>8.在实盘交易前请先对交易策略进行严格测试，避免交易带来损失，我们提供的是量化交易系统，不提供策略，也不对您的任何投资行为提供建议，您的交易均为您自己的个人行为。
      <br>微信：qiji_hello
    </div>
    <div class="border border-secondary my-3 px-3"><pre class="text-success"><code>

import ...

class StrategyDefault:
    """
    系统默认策略。此策略是模板，请勿用此策略进行实盘交易

    你需要新建策略用于回测和交易。
    新建策略按照此文件模板(可直接复制文件)，你需要改动的是选股条件、买入条件、卖出条件
    """
    def __init__(self, commobj):
        self.commobj = commobj

    def buy_strategy(self, data_list):
        # 返回 True 表示买入，否则忽略
        <span class="text-danger my-0 py-0">
        if data_list[0]['zdf'] < 3:
            return True
        </span>

    def sell_strategy(self, chicang, data_list):
        # 返回 True 表示卖出，否则忽略
        if len(data_list) < 2:
            return
        trade_date = data_list[0]['datetime']
        days = (trade_date.date() - chicang['datetime'].date()).days
        # T + 1
        if days < 1:
            return
        <span class="text-danger my-0 py-0">
        return True
        </span>

    def _stock_select(self, is_backtest, codes_info, date: datetime = None):
        """
        选股
        date 从指定日期开始选股，不指定则为最新
        """
        # 分析的历史根数
        count_week = 1
        count = 15
        count_short = 15
        rdkline = redisRW.redisrw(redisRW.db_kline)
        rdfinance = redisRW.redisrw(redisRW.db_finance)
        rdxg = redisRW.redisrw(redisRW.db_xg)
        rdindex = redisRW.redisrw(redisRW.db_index)
        if is_backtest:
            rdchicang = redisRW.redisrw(redisRW.db_backtest_chicang)
        else:
            rdchicang = redisRW.redisrw(redisRW.db_chicang)
        for d in codes_info:
            code = d['code']
            if date is not None:
                klines = rdkline.read_klines_from_before_date_count_dec(code, date, count)
            else:
                klines = rdkline.read_klines_from_count_dec(code, count)
            # 持仓
            cc_data = rdchicang.read_dec(d['code'])
            if cc_data:
                # 重设价格
                price = rdkline.read_klines_from_date_dec(code, datetime.datetime.strptime(cc_data['chicang']['datetime'], '%Y%m%d %H:%M:%S'))[0]['open']
                cc_data['chicang']['price'] = price
                # 更新市值
                cc_data['chicang']['marketValue'] = comm.sell_money_from_tol(code, klines[0]['close'], cc_data['chicang']['tol'])
                rdchicang.delete(d['code'])
                rdchicang.write_json(d['code'], cc_data)
                continue
            if len(klines) < count:
                continue
            # 选股条件
            <span class="text-danger my-0 py-0">
            tj = klines[0]['pctChg'] > 0.1 and \
              klines[0]['ma_5'] > klines[1]['ma_5'] and \
              klines[0]['close'] > klines[0]['ma_240']
            </span>
            if not tj:
                continue
            r_data = comm.xg_data(code, d['name'])
            if not rdxg.write_json(code, r_data):
                print(code, '选股数据写入错误。')

    def stock_select(self, is_backtest, codes_bk, date: datetime = None):
        rdxg = redisRW.redisrw(redisRW.db_xg)
        rdxg.del_db()
        p_list = []
        for b in codes_bk:
            p = Process(target=self._stock_select, args=(is_backtest, b, date))
            p_list.append(p)
            p.start()
        tm = datetime.datetime.now()
        print('正在选股...')
        for p in p_list:
            p.join()
        if is_backtest:
            rdchicang = redisRW.redisrw(redisRW.db_backtest_chicang)
        else:
            rdchicang = redisRW.redisrw(redisRW.db_chicang)
        # 持仓
        for d in rdchicang.read_all_dec():
            rdxg.write_json(d['code'], d)
        print(datetime.datetime.now() - tm)
        print('被选股票', len(rdxg.read_codes()), '其中持仓', len(rdchicang.read_codes()))
    </code></pre></div>
    </div>
  <!-- Optional JavaScript -->
  <!-- jQuery first, then Popper.js, then Bootstrap JS -->
  <script type="text/javascript" src="jquery-3.5.1.min.js"></script>
  <script type="text/javascript" src="bootstrap/js/bootstrap.min.js"></script>
  <!-- 直接把下载页面的CDN链接文件另存为保存，不要下载文件有乱码问题 -->
  <script type="text/javascript" src="DataTables/datatables.min.js"></script>
  <script type="text/javascript" src="d3/d3.min.js"></script>
  <script type="text/javascript" src="js/comm.js"></script>
  <script type="text/javascript" src="js/tableMain.js"></script>
  <script type="text/javascript" src="js/tableTick.js"></script>
  <script type="text/javascript" src="js/tableChengjiao.js"></script>
  <script type="text/javascript" src="js/event_el.js"></script>
  <script type="text/javascript" src="js/event_user.js"></script>
  <script type="text/javascript" src="js/ChartKline.js"></script>
  <script type="text/javascript" src="js/ChartTick.js"></script>
  <script type="text/javascript" src="js/ChartFinance.js"></script>
  <script type="text/javascript" src="js/ChartBacktest.js"></script>
</body>

</html>